package com.wecon.springdemo.pattern.template.soya;

/**
 * @author Weikang  Wang
 * @program: com.wecon.springdemo.pattern.template
 * @description: 打豆浆模板模式
 * 把大家共用的东西放到模板中，把不同的搞成抽象的让子类去实现
 * @date 2020/5/11 10:11
 */
abstract class AbstractSoyaMilk {

    /**
     * 模板方法一般都定义为final，防止子类重写模板方法
     * 定义为final，不支持修改
     */
    final void make() {
        select();
        if (needAdd()) {
            add();
        }
        soak();
        beat();
    }

    private void select() {
        System.out.println("第一步：选择好的新鲜黄豆");
    }

    /**
     * 添加配料：不同的豆浆配料不同，因此是抽象的
     */
    abstract void add();

    private void soak() {
        System.out.println("第三步：黄豆与配料开始浸泡，需要3小时");
    }

    private void beat() {
        System.out.println("第四步：黄豆和配料放到豆浆机打碎");
    }

    /**
     * 定义钩子：用户可以选择是否添加配料
     *
     * @return /
     */
    Boolean needAdd() {
        return true;
    }

}
